package view.backing.ordenProduccion;

import chemtools_logica.Beans.InsumoBean;
import chemtools_logica.Beans.LaboratorioBean;
import chemtools_logica.Beans.OrdenproduccionBean;

import chemtools_logica.Beans.OrdenproduccionxTipoproduccionBean;
import chemtools_logica.Beans.ProductoBean;
import chemtools_logica.Beans.TipoproductoBean;
import chemtools_logica.Beans.UsuarioBean;

import chemtools_logica.Entidades.Ordenproduccion;

import chemtools_logica.LN.IR.LN_SFAlmacenRemote;
import chemtools_logica.LN.IR.LN_SFDetalleformulaRemote;
import chemtools_logica.LN.IR.LN_SFLaboratorioRemote;
import chemtools_logica.LN.IR.LN_SFOrdenproduccionRemote;

import chemtools_logica.LN.IR.LN_SFProductoRemote;

import chemtools_logica.LN.IR.LN_SFTipoproductoRemote;

import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;

import java.util.List;

import java.util.Random;

import javax.annotation.PostConstruct;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.servlet.http.HttpSession;

import oracle.adf.view.rich.component.rich.RichForm;
import oracle.adf.view.rich.component.rich.RichPopup;
import oracle.adf.view.rich.component.rich.data.RichTable;

import oracle.adf.view.rich.component.rich.input.RichInputDate;
import oracle.adf.view.rich.component.rich.input.RichSelectOneChoice;
import oracle.adf.view.rich.component.rich.layout.RichPanelGridLayout;
import oracle.adf.view.rich.component.rich.nav.RichButton;

import org.apache.myfaces.trinidad.event.SelectionEvent;

import view.backing.Utils.Utils;

public class Frm_ordenProduccion {
    private bSessionScopeBeanordenProduccion sessionScopeBeanordenProduccion = new bSessionScopeBeanordenProduccion();
    
    private LN_SFOrdenproduccionRemote lN_SFOrdenproduccionRemote;
    private LN_SFLaboratorioRemote lN_SFLaboratorioRemote;
    private LN_SFProductoRemote lN_SFProductoRemote;
    private LN_SFTipoproductoRemote lN_SFTipoProductoRemote;
    private LN_SFDetalleformulaRemote lN_SFDetalleformulaRemote;
    
    private RichForm formOrdenProduccion;
    private RichTable tb_ordenProduccion;
    private RichButton btn_editar;
    private RichPopup pop_editarOrden;
    private RichPopup pop_addOrden;
    private RichPanelGridLayout pf_busqueda;
    private RichInputDate pf_fechaDesdeBusqueda;
    private RichInputDate pf_fechaHastaBusqueda;
    private RichPopup pop_addProductos;
    private RichTable tb_productos;
    private RichTable tb_productosAux;
    private RichButton btn_addProducto;
    private RichButton btn_deleteProducto;
    private RichPopup pop_cantTipoProdu;
    private RichTable tb_prodOrdProdEdit;
    private RichPopup pop_verProductos;
    private RichButton btn_verProductos;
    private RichSelectOneChoice selectEstado;

    public Frm_ordenProduccion() {
        
    }
    
    
    @PostConstruct
    public void methodInvokeOncedOnPageLoad() {
        try {
            final Context context = getInitialContext();
            lN_SFOrdenproduccionRemote = (LN_SFOrdenproduccionRemote) context.lookup("map-LN_SFOrdenproduccion#chemtools_logica.LN.IR.LN_SFOrdenproduccionRemote"); 
            lN_SFLaboratorioRemote = (LN_SFLaboratorioRemote) context.lookup("map-LN_SFLaboratorio#chemtools_logica.LN.IR.LN_SFLaboratorioRemote");
            lN_SFProductoRemote = (LN_SFProductoRemote) context.lookup("map-LN_SFProducto#chemtools_logica.LN.IR.LN_SFProductoRemote");
            lN_SFTipoProductoRemote = (LN_SFTipoproductoRemote) context.lookup("map-LN_SFTipoproducto#chemtools_logica.LN.IR.LN_SFTipoproductoRemote");
            lN_SFDetalleformulaRemote = (LN_SFDetalleformulaRemote) context.lookup("map-LN_SFDetalleformula#chemtools_logica.LN.IR.LN_SFDetalleformulaRemote"); 
            
        }catch(Exception e){
        
            
        }
        
        HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        UsuarioBean usuario = (UsuarioBean) sesion.getAttribute("usuario");
        sessionScopeBeanordenProduccion.setUsuario(usuario);
        
        //Llenar BD
        sessionScopeBeanordenProduccion.setListaOrdenproduccion(lN_SFOrdenproduccionRemote.allOrdenproduccion());
        //LlenarComboBox
        sessionScopeBeanordenProduccion.setListaLaboratorio(this.llenaLaboratorio());
        sessionScopeBeanordenProduccion.setListaEstadoBusqueda(this.llenaEstados());
        
    }
    
    
    
    public void busquedaOrdenProduccion(ActionEvent event){
        OrdenproduccionBean bean = new OrdenproduccionBean();
        
        bean.setIdLaboratorio(sessionScopeBeanordenProduccion.getLaboratorioBusqueda());
        bean.setFechaRegistroDesde(sessionScopeBeanordenProduccion.getFechaDesdeBusqueda());
        bean.setFechaRegistroHasta(sessionScopeBeanordenProduccion.getFechaHastaBusqueda());
        bean.setEstado(sessionScopeBeanordenProduccion.getEstadoBusqueda());

        sessionScopeBeanordenProduccion.setListaOrdenproduccion(new ArrayList<OrdenproduccionBean>());
        sessionScopeBeanordenProduccion.setListaOrdenproduccion(lN_SFOrdenproduccionRemote.getOrdenProduccionBusqueda(bean));
        getTb_ordenProduccion().setValue(sessionScopeBeanordenProduccion.getListaOrdenproduccion());
        
        Utils.addTarget(getTb_ordenProduccion());
        
    }
    
    public void limpiaryRefrescar(ActionEvent event){
        sessionScopeBeanordenProduccion.setLaboratorioBusqueda(-1);
        
        getPf_fechaDesdeBusqueda().setValue("");
        getPf_fechaHastaBusqueda().setValue("");
        sessionScopeBeanordenProduccion.setEstadoBusqueda(-1);
    
        
        sessionScopeBeanordenProduccion.setListaOrdenproduccion(new ArrayList<OrdenproduccionBean>());
        sessionScopeBeanordenProduccion.setListaOrdenproduccion(lN_SFOrdenproduccionRemote.allOrdenproduccion());
        getTb_ordenProduccion().setValue(sessionScopeBeanordenProduccion.getListaOrdenproduccion());
        getBtn_verProductos().setDisabled(true);
        btn_editar.setDisabled(true);
        Utils.addTarget(getBtn_verProductos());
        Utils.addTarget(getBtn_editar());
        Utils.clearRowSelection(getTb_ordenProduccion());
        Utils.addTarget(getTb_ordenProduccion());
        Utils.addTarget(getPf_busqueda());
    }
    
    public void selectOrdenProd(SelectionEvent se){
        RichTable t = (RichTable)se.getSource();
        OrdenproduccionBean beanOrdenProd = (OrdenproduccionBean) t.getSelectedRowData();
        
        sessionScopeBeanordenProduccion.setOrdenProduccionBean(beanOrdenProd);
        
        if(beanOrdenProd.getEstado() != 4 ){
            getBtn_editar().setDisabled(false);
            getBtn_verProductos().setDisabled(false);
            
            Utils.addTarget(getBtn_editar());
            Utils.addTarget(getBtn_verProductos());
        }
        
    }
    
    public void abrirModalEditar(ActionEvent ae){
        OrdenproduccionBean ordenProdBean = sessionScopeBeanordenProduccion.getOrdenProduccionBean();
        
        sessionScopeBeanordenProduccion.setCodOrdenProdEdit(ordenProdBean.getIdOrdenProduccion());
        sessionScopeBeanordenProduccion.setComentarioEdit(ordenProdBean.getComentario());
        sessionScopeBeanordenProduccion.setFechaRegistroEdit(ordenProdBean.getFechaRegistro());
        int estado = ordenProdBean.getEstado();
        sessionScopeBeanordenProduccion.setEstadoEdit(estado);
        sessionScopeBeanordenProduccion.setLaboratorioEdit(ordenProdBean.getIdLaboratorio());
        sessionScopeBeanordenProduccion.setListaEstadoEdit(this.llenaEstadosEdit(estado));
        
        Utils.addTarget(getSelectEstado());
        Utils.showPopUpMIDDLE(getPop_editarOrden());
    }
    
    public void editarOrdenProd (ActionEvent ae){
        
        if(sessionScopeBeanordenProduccion.isCambioEdit()){
        
            OrdenproduccionBean ordenProdBean = sessionScopeBeanordenProduccion.getOrdenProduccionBean();
            
            ordenProdBean.setEstado(sessionScopeBeanordenProduccion.getEstadoEdit());
            ordenProdBean.setIdLaboratorio(sessionScopeBeanordenProduccion.getLaboratorioEdit());
            
            lN_SFOrdenproduccionRemote.edtiOrdenProd(ordenProdBean);
            
            sessionScopeBeanordenProduccion.setListaOrdenproduccion(lN_SFOrdenproduccionRemote.allOrdenproduccion());
            getTb_ordenProduccion().setValue(sessionScopeBeanordenProduccion.getListaOrdenproduccion());
            Utils.addTarget(getTb_ordenProduccion()); 
            
            getPop_editarOrden().hide();
            Utils.showMessage("Los datos fueron editados", null, 2);
            this.limpiaryRefrescar(null);
        }
        else{
            getPop_editarOrden().hide();
        }
    }
    
    
    public void isCambioHechoEdit(ValueChangeEvent ecv){
        sessionScopeBeanordenProduccion.setCambioEdit(true);
    }
    
    public void abrirModalAdd(ActionEvent ae){
        sessionScopeBeanordenProduccion.setComentarioAdd("");
        sessionScopeBeanordenProduccion.setFechaRegistroAdd(null);
        sessionScopeBeanordenProduccion.setEstadoAdd(-1);
        sessionScopeBeanordenProduccion.setLaboratorioAdd(-1);
        
        sessionScopeBeanordenProduccion.setListaProductosActivos(lN_SFTipoProductoRemote.listaTipoProductoActivosConMedida());
        getTb_productos().setValue(sessionScopeBeanordenProduccion.getListaProductosActivos());
        Utils.addTarget(getTb_productos());
        
        sessionScopeBeanordenProduccion.setListaProductoAux(new ArrayList<TipoproductoBean>());
        Utils.addTarget(getTb_productosAux());
        
        Utils.showPopUpMIDDLE(pop_addOrden);
        
    }
    
    public void addOrdenProd(ActionEvent ae){   
            
            if(sessionScopeBeanordenProduccion.getListaProductoAux().size() != 0){ 
            OrdenproduccionBean ordenProdBean = new OrdenproduccionBean();
    
            ordenProdBean.setComentario(sessionScopeBeanordenProduccion.getComentarioAdd());
            ordenProdBean.setFechaRegistro(new Date());
            ordenProdBean.setEstado(1);
            ordenProdBean.setIdLaboratorio(sessionScopeBeanordenProduccion.getLaboratorioAdd());
            ordenProdBean.setIdUsuario(sessionScopeBeanordenProduccion.getUsuario().getIdUsuario());
            ordenProdBean.setImagen(null);

            List<TipoproductoBean> productosSelecc = sessionScopeBeanordenProduccion.getListaProductoAux();
            
            List<OrdenproduccionxTipoproduccionBean> ordenTipo = new ArrayList<OrdenproduccionxTipoproduccionBean>();
            for(TipoproductoBean bean : productosSelecc){
                OrdenproduccionxTipoproduccionBean beanTPO = new OrdenproduccionxTipoproduccionBean();
                
                beanTPO.setTipoproducto(bean);
                beanTPO.setCantidad(bean.getCantidad());
                beanTPO.setConformidad(0);
                beanTPO.setOrdenproduccion(ordenProdBean);
                
                ordenTipo.add(beanTPO);
            }
            
                lN_SFOrdenproduccionRemote.addOrdenProd1(ordenProdBean, ordenTipo);
            
            
            sessionScopeBeanordenProduccion.setListaOrdenproduccion(lN_SFOrdenproduccionRemote.allOrdenproduccion());
            getTb_ordenProduccion().setValue(sessionScopeBeanordenProduccion.getListaOrdenproduccion());
            Utils.addTarget(getTb_ordenProduccion());
            
            Utils.showMessage("La orden de produccion fue agregada", null, 2);
            getPop_addOrden().hide();
            this.limpiaryRefrescar(null);
            
            }else{
                Utils.showMessage("Ingrese al menos un tipo de producto", null, 1);
            }
        }
    

    
    public void limpiarComponentesBusqueda(){
        sessionScopeBeanordenProduccion.setCodigoBusqueda("");
    }
    
    
    public ArrayList llenaLaboratorio(){
        ArrayList laboratorios = new ArrayList();
        List<LaboratorioBean> laboratorioBean = lN_SFLaboratorioRemote.getAllLaboratoriosActivos();
        
        for(LaboratorioBean e : laboratorioBean){
            laboratorios.add(new SelectItem(e.getIdLaboratorio(), e.getNombre()));
        }
        return laboratorios;        
    }
    
    public ArrayList llenaEstados(){
        ArrayList estados = new ArrayList();
        estados.add(new SelectItem(0,"Inactivo"));
        estados.add(new SelectItem(1,"Pendiente"));
        estados.add(new SelectItem(2,"Incompleta"));
        estados.add(new SelectItem(3,"Inconclusa"));
        estados.add(new SelectItem(4,"Concluida"));
        
        return estados;
    }
    
    public ArrayList llenaEstadosEdit(int estado){
        ArrayList estados = new ArrayList();
        if(estado == 1 || estado == 0){
            estados.add(new SelectItem(0,"Inactivo"));
            estados.add(new SelectItem(1,"Pendiente"));
        }
        
        else if(estado == 2 || estado == 3){
            estados.add(new SelectItem(2,"Incompleta"));
            estados.add(new SelectItem(3,"Inconclusa"));
        }
        return estados;
    }    
    
    
    public void abrirModalAnadirProductos(ActionEvent event){

        Utils.showPopUpMIDDLE(getPop_addProductos());
    }
    
    public void productoSelecc(SelectionEvent se){
        RichTable t = (RichTable)se.getSource();
        TipoproductoBean beanProducto = (TipoproductoBean) t.getSelectedRowData();
        //beanProducto.getCantidad();

        getBtn_addProducto().setDisabled(false);
        Utils.addTarget(getBtn_addProducto());
        
        sessionScopeBeanordenProduccion.setTipoProductoSeleciconado(beanProducto);
    }
    
    public void productoSeleccAux(SelectionEvent se){
        RichTable t = (RichTable)se.getSource();
        TipoproductoBean beanProducto = (TipoproductoBean) t.getSelectedRowData();
        
        getBtn_deleteProducto().setDisabled(false);
        Utils.addTarget(getBtn_deleteProducto());
        
        sessionScopeBeanordenProduccion.setTipoProductoSeleciconadoAux(beanProducto);
    }
    
    public void abrirPOPCantidadTipoProdu(ActionEvent event){
        
        boolean tOf = lN_SFDetalleformulaRemote.tieneFormula(sessionScopeBeanordenProduccion.getTipoProductoSeleciconado().getIdTipoProducto());
        
        if(tOf){
            sessionScopeBeanordenProduccion.setCantidadTipoProduc("");
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("idTipoProducto", sessionScopeBeanordenProduccion.getTipoProductoSeleciconado().getIdTipoProducto());
            Utils.showPopUpAFTER_START(getPop_cantTipoProdu(), getBtn_addProducto()); 
        }else{
            Utils.showMessage("El Tipo de Producto seleccionado no tiene formula", null, 1);
        }  
    }
    
    public void agregarProducto(ActionEvent event){
        String cantidad = sessionScopeBeanordenProduccion.getCantidadTipoProduc();
        int cant = Integer.parseInt(cantidad);
        
        TipoproductoBean beanProducto = sessionScopeBeanordenProduccion.getTipoProductoSeleciconado();
        beanProducto.setCantidad(cant);
        
        sessionScopeBeanordenProduccion.getListaProductoAux().add(beanProducto);
        
        sessionScopeBeanordenProduccion.getListaProductosActivos().remove(beanProducto);
        
        Utils.clearRowSelection(getTb_productos());
        Utils.clearRowSelection(getTb_productosAux());
        
        getBtn_addProducto().setDisabled(true);
        Utils.addTarget(getBtn_addProducto());

        Utils.addTarget(getTb_productos());
        Utils.addTarget(getTb_productosAux());
        
        getPop_cantTipoProdu().hide();

    }
    
    public void eliminarProducto(ActionEvent event){
        TipoproductoBean beanProducto = sessionScopeBeanordenProduccion.getTipoProductoSeleciconadoAux();
        
        sessionScopeBeanordenProduccion.getListaProductoAux().remove(beanProducto);
        
        sessionScopeBeanordenProduccion.getListaProductosActivos().add(beanProducto);
        
        Utils.clearRowSelection(getTb_productos());
        Utils.clearRowSelection(getTb_productosAux());
        
        getBtn_deleteProducto().setDisabled(true);
        Utils.addTarget(getBtn_deleteProducto());
        
        Utils.addTarget(getTb_productos());
        Utils.addTarget(getTb_productosAux());
    }
    
    public void abrirPopUpVerProductos(ActionEvent ae){
        OrdenproduccionBean ordenProdBean = sessionScopeBeanordenProduccion.getOrdenProduccionBean();
        sessionScopeBeanordenProduccion.setListaProductosEdit(lN_SFTipoProductoRemote.getTipodeProductoxOrdenProdConMedida(ordenProdBean));
        
        Utils.showPopUpMIDDLE(getPop_verProductos());
        getTb_prodOrdProdEdit().setValue(sessionScopeBeanordenProduccion.getListaProductosEdit());
        Utils.addTarget(getTb_prodOrdProdEdit());
    }
    
    public void cerrarModalAddProductos(ActionEvent ae){
        getPop_addProductos().hide();
    }


    private static Context getInitialContext() throws NamingException {
        Hashtable env = new Hashtable();
        // WebLogic Server 10.x/12.x connection details
        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        env.put(Context.PROVIDER_URL, "t3://127.0.0.1:7101");
        return new InitialContext(env);
    }

    public void setFormOrdenProduccion(RichForm formOrdenProduccion) {
        this.formOrdenProduccion = formOrdenProduccion;
    }

    public RichForm getFormOrdenProduccion() {
        return formOrdenProduccion;
    }

    public void setSessionScopeBeanordenProduccion(bSessionScopeBeanordenProduccion sessionScopeBeanordenProduccion) {
        this.sessionScopeBeanordenProduccion = sessionScopeBeanordenProduccion;
    }

    public bSessionScopeBeanordenProduccion getSessionScopeBeanordenProduccion() {
        return sessionScopeBeanordenProduccion;
    }

    public void setTb_ordenProduccion(RichTable tb_ordenProduccion) {
        this.tb_ordenProduccion = tb_ordenProduccion;
    }

    public RichTable getTb_ordenProduccion() {
        return tb_ordenProduccion;
    }

    public void setBtn_editar(RichButton btn_editar) {
        this.btn_editar = btn_editar;
    }

    public RichButton getBtn_editar() {
        return btn_editar;
    }

    public void setPop_editarOrden(RichPopup pop_editarOrden) {
        this.pop_editarOrden = pop_editarOrden;
    }

    public RichPopup getPop_editarOrden() {
        return pop_editarOrden;
    }

    public void setPop_addOrden(RichPopup pop_addOrden) {
        this.pop_addOrden = pop_addOrden;
    }

    public RichPopup getPop_addOrden() {
        return pop_addOrden;
    }

    public void setPf_busqueda(RichPanelGridLayout pf_busqueda) {
        this.pf_busqueda = pf_busqueda;
    }

    public RichPanelGridLayout getPf_busqueda() {
        return pf_busqueda;
    }

    public void setPf_fechaDesdeBusqueda(RichInputDate pf_fechaDesdeBusqueda) {
        this.pf_fechaDesdeBusqueda = pf_fechaDesdeBusqueda;
    }

    public RichInputDate getPf_fechaDesdeBusqueda() {
        return pf_fechaDesdeBusqueda;
    }

    public void setPf_fechaHastaBusqueda(RichInputDate pf_fechaHastaBusqueda) {
        this.pf_fechaHastaBusqueda = pf_fechaHastaBusqueda;
    }

    public RichInputDate getPf_fechaHastaBusqueda() {
        return pf_fechaHastaBusqueda;
    }

    public void setPop_addProductos(RichPopup pop_addProductos) {
        this.pop_addProductos = pop_addProductos;
    }

    public RichPopup getPop_addProductos() {
        return pop_addProductos;
    }

    public void setTb_productos(RichTable tb_productos) {
        this.tb_productos = tb_productos;
    }

    public RichTable getTb_productos() {
        return tb_productos;
    }

    public void setTb_productosAux(RichTable tb_productosAux) {
        this.tb_productosAux = tb_productosAux;
    }

    public RichTable getTb_productosAux() {
        return tb_productosAux;
    }

    public void setBtn_addProducto(RichButton btn_addProducto) {
        this.btn_addProducto = btn_addProducto;
    }

    public RichButton getBtn_addProducto() {
        return btn_addProducto;
    }

    public void setBtn_deleteProducto(RichButton btn_deleteProducto) {
        this.btn_deleteProducto = btn_deleteProducto;
    }

    public RichButton getBtn_deleteProducto() {
        return btn_deleteProducto;
    }

    public void setPop_cantTipoProdu(RichPopup pop_cantTipoProdu) {
        this.pop_cantTipoProdu = pop_cantTipoProdu;
    }

    public RichPopup getPop_cantTipoProdu() {
        return pop_cantTipoProdu;
    }

    public void setTb_prodOrdProdEdit(RichTable tb_prodOrdProdEdit) {
        this.tb_prodOrdProdEdit = tb_prodOrdProdEdit;
    }

    public RichTable getTb_prodOrdProdEdit() {
        return tb_prodOrdProdEdit;
    }

    public void setPop_verProductos(RichPopup pop_verProductos) {
        this.pop_verProductos = pop_verProductos;
    }

    public RichPopup getPop_verProductos() {
        return pop_verProductos;
    }

    public void setBtn_verProductos(RichButton btn_verProductos) {
        this.btn_verProductos = btn_verProductos;
    }

    public RichButton getBtn_verProductos() {
        return btn_verProductos;
    }

    public void setSelectEstado(RichSelectOneChoice selectEstado) {
        this.selectEstado = selectEstado;
    }

    public RichSelectOneChoice getSelectEstado() {
        return selectEstado;
    }
}
